From 834516f06e5bd47f3259732f3d29496f557567c2 Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Thu, 14 Feb 2008 09:26:38 +0000 Subject: [PATCH] ioemu: backport upstream's qemu_memalign. Signed-off-by: Samuel Thibault --- tools/ioemu/block-vbd.c | 4 ++-- tools/ioemu/hw/fdc.c | 7 ++++++- tools/ioemu/hw/ide.c | 2 +- tools/ioemu/hw/scsi-disk.c | 2 +- tools/ioemu/osdep.c | 20 ++++++++++++++++++++ tools/ioemu/osdep.h | 1 + 6 files changed, 31 insertions(+), 5 deletions(-) diff --git a/tools/ioemu/block-vbd.c b/tools/ioemu/block-vbd.c index 5561cf1787..937bb5e62d 100644 --- a/tools/ioemu/block-vbd.c +++ b/tools/ioemu/block-vbd.c @@ -227,7 +227,7 @@ static int vbd_read(BlockDriverState *bs, * copying */ if (!((uintptr_t)buf & (SECTOR_SIZE-1))) return vbd_aligned_io(bs, sector_num, buf, nb_sectors, 0); - iobuf = memalign(PAGE_SIZE, nb_sectors * SECTOR_SIZE); + iobuf = qemu_memalign(PAGE_SIZE, nb_sectors * SECTOR_SIZE); ret = vbd_aligned_io(bs, sector_num, iobuf, nb_sectors, 0); memcpy(buf, iobuf, nb_sectors * SECTOR_SIZE); free(iobuf); @@ -246,7 +246,7 @@ static int vbd_write(BlockDriverState *bs, int ret; if (!((uintptr_t)buf & (SECTOR_SIZE-1))) return vbd_aligned_io(bs, sector_num, (uint8_t*) buf, nb_sectors, 1); - iobuf = memalign(PAGE_SIZE, nb_sectors * SECTOR_SIZE); + iobuf = qemu_memalign(PAGE_SIZE, nb_sectors * SECTOR_SIZE); memcpy(iobuf, buf, nb_sectors * SECTOR_SIZE); ret = vbd_aligned_io(bs, sector_num, iobuf, nb_sectors, 1); free(iobuf); diff --git a/tools/ioemu/hw/fdc.c b/tools/ioemu/hw/fdc.c index dc2ea6ebff..5989afd7d0 100644 --- a/tools/ioemu/hw/fdc.c +++ b/tools/ioemu/hw/fdc.c @@ -378,7 +378,7 @@ struct fdctrl_t { uint8_t cur_drv; uint8_t bootsel; /* Command FIFO */ - uint8_t fifo[FD_SECTOR_LEN]; + uint8_t *fifo; uint32_t data_pos; uint32_t data_len; uint8_t data_state; @@ -497,6 +497,11 @@ fdctrl_t *fdctrl_init (int irq_lvl, int dma_chann, int mem_mapped, fdctrl = qemu_mallocz(sizeof(fdctrl_t)); if (!fdctrl) return NULL; + fdctrl->fifo = qemu_memalign(512, FD_SECTOR_LEN); + if (fdctrl->fifo == NULL) { + qemu_free(fdctrl); + return NULL; + } fdctrl->result_timer = qemu_new_timer(vm_clock, fdctrl_result_timer, fdctrl); diff --git a/tools/ioemu/hw/ide.c b/tools/ioemu/hw/ide.c index cba064bd10..9dd9653aa9 100644 --- a/tools/ioemu/hw/ide.c +++ b/tools/ioemu/hw/ide.c @@ -2306,7 +2306,7 @@ static void ide_init2(IDEState *ide_state, for(i = 0; i < 2; i++) { s = ide_state + i; - s->io_buffer = memalign(getpagesize(), MAX_MULT_SECTORS*512 + 4); + s->io_buffer = qemu_memalign(getpagesize(), MAX_MULT_SECTORS*512 + 4); if (i == 0) s->bs = hd0; else diff --git a/tools/ioemu/hw/scsi-disk.c b/tools/ioemu/hw/scsi-disk.c index d62d4d0d95..acbe75fc98 100644 --- a/tools/ioemu/hw/scsi-disk.c +++ b/tools/ioemu/hw/scsi-disk.c @@ -81,7 +81,7 @@ static SCSIRequest *scsi_new_request(SCSIDevice *s, uint32_t tag) free_requests = r->next; } else { r = qemu_malloc(sizeof(SCSIRequest)); - r->dma_buf = memalign(getpagesize(), SCSI_DMA_BUF_SIZE); + r->dma_buf = qemu_memalign(getpagesize(), SCSI_DMA_BUF_SIZE); } r->dev = s; r->tag = tag; diff --git a/tools/ioemu/osdep.c b/tools/ioemu/osdep.c index d1eff8deb5..5ec16b47da 100644 --- a/tools/ioemu/osdep.c +++ b/tools/ioemu/osdep.c @@ -61,6 +61,10 @@ void *qemu_malloc(size_t size) } #if defined(_WIN32) +void *qemu_memalign(size_t alignment, size_t size) +{ + return VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_READWRITE); +} void *qemu_vmalloc(size_t size) { @@ -172,6 +176,22 @@ void kqemu_vfree(void *ptr) #endif +void *qemu_memalign(size_t alignment, size_t size) +{ +#if defined(_POSIX_C_SOURCE) + int ret; + void *ptr; + ret = posix_memalign(&ptr, alignment, size); + if (ret != 0) + return NULL; + return ptr; +#elif defined(_BSD) + return valloc(size); +#else + return memalign(alignment, size); +#endif +} + /* alloc shared memory pages */ void *qemu_vmalloc(size_t size) { diff --git a/tools/ioemu/osdep.h b/tools/ioemu/osdep.h index bd6ffc1713..6df1d87d12 100644 --- a/tools/ioemu/osdep.h +++ b/tools/ioemu/osdep.h @@ -14,6 +14,7 @@ void *qemu_mallocz(size_t size); void qemu_free(void *ptr); char *qemu_strdup(const char *str); +void *qemu_memalign(size_t alignment, size_t size); void *qemu_vmalloc(size_t size); void qemu_vfree(void *ptr); -- 2.30.2